//
// Created by wkm on 2023-12-11.
//

#include "sync_mux41_driver.h"
#include "sync_mux41_monitor.h"
#include "sync_mux41.h"

const int CLOCK_PERIOD = 2;

int sc_main(int argc, char *argv[]) {
    sc_signal<bool> t_reset;
    sc_signal<sc_uint<4>> t_inp;
    sc_signal<sc_uint<2>> t_sel;
    sc_signal<bool> t_out;

    sc_clock t_clock("clock", CLOCK_PERIOD);
    // 因为没有为时钟周期指定时间单位
    // 所以默使用默认的时间单位（即1ns）

    // 实例引用被测模块
    sync_mux41 m1("SyncMuxer4x1");
    m1.clock(t_clock);
    m1.reset(t_reset);
    m1.sel(t_sel);
    m1.inp(t_inp);
    m1.out(t_out);

    // 实例引用驱动器
    driver d1("GenerateWaveForms");
    d1.d_reset(t_reset);
    d1.d_sel(t_sel);
    d1.d_inp(t_inp);

    // 实例引用检测器
    monitor mol("MonitorWaveforms");
    mol.m_clock(t_clock);
    mol.m_reset(t_reset);
    mol.m_sel(t_sel);
    mol.m_inp(t_inp);
    mol.m_out(t_out);

    sc_trace_file *tf = sc_create_vcd_trace_file("sync_mux41");
    sc_trace(tf, t_clock, "clock");
    sc_trace(tf, t_reset, "reset");
    sc_trace(tf, t_inp, "input");
    sc_trace(tf, t_sel, "select");
    sc_trace(tf, t_out, "output");

    // 运行仿真 100 ns
    sc_start(100, SC_NS);
    sc_close_vcd_trace_file(tf);

    return (0);
}
